/*
 * Copyright (c) 2010-2011 NOO. All Rights Reserved.
 * [Id:EntityDataModalFactory.java  11-10-24 上午12:29 poplar.yfyang ]
 */
package org.mumu.pawn.datamodal;

import org.mumu.pawn.domain.Department;
import org.mumu.pawn.domain.Role;
import org.mumu.pawn.domain.User;
import org.mumu.pawn.fm.dm.LazyPawnDataModel;

import javax.persistence.EntityManager;

/**
 * <p>
 * 产生数据模型JSF表格使用的工厂.
 * </p>
 *
 * @author poplar.yfyang
 * @version 1.0 11-10-24 上午12:29
 * @since JDK 1.5
 */
public class EntityDataModalFactory {

    /**
     * 获取指定范型参数的列表数据模型。
     *
     * @param arg_em 实体管理器
     * @param cls    类
     * @return 数据模型
     */
    public static LazyPawnDataModel builderDataModal(EntityManager arg_em, Class<?> cls) {
        if (cls == User.class) {
            return new UserDataModelLazy(arg_em);
        } else if (cls == Department.class) {
            return new DepartmentDataModelLazy(arg_em);
        } else if (cls == Role.class) {
            return new RoleDataModelLazy(arg_em);
        }
        return null;
    }

    /**
     * 用户数据模型
     */
    private static class UserDataModelLazy extends LazyPawnDataModel<User> {
        /**
         * 构造器
         *
         * @param entityManager JPA管理器
         */
        private UserDataModelLazy(EntityManager entityManager) {
            super(entityManager, User.class);
        }

        /**
         * 取得实体的主键信息
         *
         * @param argt 实体
         * @return 主键值
         */
        @Override
        protected Object getId(User argt) {
            return argt.getId();
        }
    }

    /**
     * 部门列表的数据模型
     */
    private static class DepartmentDataModelLazy extends LazyPawnDataModel<Department> {

        /**
         * 构造函数，设置实体管理器和实体类别
         *
         * @param arg_entityManager 实体管理器
         */
        public DepartmentDataModelLazy(EntityManager arg_entityManager) {
            super(arg_entityManager, Department.class);
        }

        @Override
        protected Object getId(Department arg_t) {
            return arg_t.getId();
        }
    }

    /**
     * 部门列表的数据模型
     */
    private static class RoleDataModelLazy extends LazyPawnDataModel<Role> {

        /**
         * 构造函数，设置实体管理器和实体类别
         *
         * @param arg_entityManager 实体管理器
         */
        public RoleDataModelLazy(EntityManager arg_entityManager) {
            super(arg_entityManager, Role.class);
        }

        @Override
        protected Object getId(Role arg_t) {
            return arg_t.getId();
        }
    }
}
